/*
 *Autor: Anderson Campos Cardoso
 *
 *Conteúdo: Arquivo cabeçalho para a classe relogio
 */

#include "Relogio.h"

#ifndef _RELOGIO_CPP_
#define _RELOGIO_CPP_

/*
 *Inicia as variáveis
 */
void Relogio::iniciarContagem(void)
{
   SDL_Init(SDL_INIT_TIMER);
   tempoAtual = SDL_GetTicks();
   tempoAnterior = tempoAtual;
}

/*
 *Calcula a variação de tempo e espera o restante do tempo do frame se necessário
 */
void Relogio::esperar(void)
{
   Uint32 deltaTempo;
   tempoAtual = SDL_GetTicks();   /*Calcula o tempo atual*/

   /*A estrutura if..else abaixo serve para calcular a variação de tempo*/
   if (tempoAtual > tempoAnterior)
      deltaTempo = tempoAtual - tempoAnterior;
   else
      deltaTempo = 0xffffffff - (tempoAnterior-tempoAtual) + 1;

   /*caso necessário espera mais um tempo suficiente para completar um periodo*/
   if (deltaTempo < periodo)
      SDL_Delay(periodo - deltaTempo);

   tempoAnterior = SDL_GetTicks(); /*prepara o atributo para o próximo frame*/
}

/*
 *metodo usado no lugar do metodo Esperar quando não se deseja limitar o frame rate
 */
void Relogio::fimLoop(void)
{
    tempoAnterior = SDL_GetTicks(); /*prepara o atributo para o próximo frame*/
    SDL_Delay(2);
}

/*
 *retorna a variação de tempo desde o inicio do loop
 */
Uint32 Relogio::getDeltaTempo(void)
{
   Uint32 deltaTempo;
   tempoAtual = SDL_GetTicks();   /*Calcula o tempo atual*/

   /*A estrutura if..else abaixo serve para calcular a variação de tempo*/
   if (tempoAtual > tempoAnterior)
      deltaTempo = tempoAtual - tempoAnterior;
   else
      deltaTempo = 0xffffffff - (tempoAnterior-tempoAtual) + 1;

   return deltaTempo;
}

/*
 *Recebe como parametro um valor de tempo e retorna a variação de tempo até o tempo atual
 */
Uint32 Relogio::calculaDeltaTempo(Uint32 p_tempoAnterior)
{
   Uint32 deltaTempo;
   tempoAtual = SDL_GetTicks();   /*Calcula o tempo atual*/

   /*A estrutura if..else abaixo serve para calcular a variação de tempo*/
   if (tempoAtual > tempoAnterior)
      deltaTempo = tempoAtual - p_tempoAnterior;
   else
      deltaTempo = 0xffffffff - (tempoAnterior-tempoAtual) + 1;

   return deltaTempo;
}

/*
 *Construtor da classe
 */
Relogio::Relogio(void)
{
   periodo = 1000/QUADROS_SEGUNDO;/*atualiza a tela a uma frequencia de QUADROS_SEGUNDO Hz*/
}


Relogio::~Relogio(void)
{
   ;
}

#endif
